package com.tom.demo.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * springboot中定时任务执行时候的线程池配置
 * 作用:专注于定时任务(使用@Scheduled注解的方法使用该配置)
 * 如果项目没有配置该线程池，
 * 那么当有多个定时任务可能在同一个时刻执行的话，就会阻塞，
 * 因为默认的ThreadPoolTaskScheduler大小为1
 */
@Configuration
public class ScheduleTaskConfig {

    /**
     * 开启定时任务，也就是加了 @Scheduled 注解的定时任务，就会使用ThreadPoolTaskScheduler该线程池
     * 当定时任务数 <= poolSize(50)  的时候，多个定时任务会并行
     * 当定时任务数 > poolSize(50)  的时候，超出核心线程poolSize(50)的部分，会进入线程池的等待队列中
     * @return
     */
    @Bean(name = "taskScheduler")
    public TaskScheduler taskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(50);
        threadPoolTaskScheduler.setThreadNamePrefix("<===MyTask-Scheduler定时任务线程===>");
        //关闭时等待任务完成
        threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //强制关闭之前等待任务完成的最大秒数
        threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
        //设置取消时移除策略
        threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);
        return threadPoolTaskScheduler;
    }
}
